package org.edu.modules.oa.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import groovy.util.logging.Slf4j;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.SecurityUtils;
import org.edu.common.api.vo.Result;
import org.edu.common.aspect.annotation.AutoLog;
import org.edu.common.system.vo.LoginUser;
import org.edu.modules.oa.config.QueryConditionTool;
import org.edu.modules.oa.entity.SysDictItemEntity;
import org.edu.modules.oa.entity.VeOaCarInfoEntity;
import org.edu.modules.oa.entity.VeOaCarSetEntity;
import org.edu.modules.oa.entity.VeOaSysDictEntity;
import org.edu.modules.oa.service.IVeOaCarSetService;
import org.edu.modules.oa.service.IVeSysDictService;
import org.edu.modules.oa.util.OssDownloadUtil;
import org.edu.modules.oa.vo.QueryCondition;
import org.edu.modules.oa.vo.VeOaCarSetVo;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Api(tags="车辆参数设置")
@RestController
@RequestMapping("oa/veOaCarSet")
@Slf4j
@ApiSort(value = 100)

public class VeOaCarSetController {


    @Resource()
    private IVeOaCarSetService iVeOaCarSetService;// 参数设置业务类
    @Resource()
    private IVeSysDictService iVeSysDictService;// 字典业务类

@AutoLog(value = "车辆参数设置-显示表格")

    @ApiOperation(value="显示表格", notes="车辆参数设置-显示表格")

    @PostMapping(value = "/showTable")

    public Result<?> showTable(VeOaCarSetVo veOaCarSetVo, Integer startPage, Integer pageSize) {
        HashMap<String, Object> map=iVeOaCarSetService.showTable(veOaCarSetVo,startPage,pageSize);
    // 获取redis存的用户值

    LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();

    map.put("userName",user.getRealname());
        return Result.OK(map);
    }
    @AutoLog(value = "车辆参数设置-单个删除")
    @ApiOperation(value="单个删除", notes="车辆参数设置-单个删除")
    @PostMapping(value = "/oneDelete")

    public Result<?> oneDelete(Integer id) {
        Integer result=iVeOaCarSetService.deleteRecord(id);
        return Result.OK();
    }
    @AutoLog(value = "车辆参数设置-批量删除")
    @ApiOperation(value="批量删除", notes="车辆参数设置-批量删除")
    @PostMapping(value = "/allDelete")

    public Result<?> allDelete(String idStr) {
        Integer result=0;
        String data[] = idStr.split(",");

        for (int i=1;i<data.length;i++){

            result+=iVeOaCarSetService.deleteRecord(Integer.valueOf(data[i]));

        }
        return Result.OK();
    }
    //导出
    @AutoLog(value = "车辆参数设置-导出excel表格")
    @ApiOperation(value = "导出excel表格", notes = "车辆参数设置—导出excel表格")
    @GetMapping(value = "/exportTable")
    // ModelAndView 导出表格流
    public ModelAndView exportTable() {
        // 创建导出流
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 查数据获得车辆参数设置表格的集合
        List<VeOaCarSetVo> list = iVeOaCarSetService.xporte();
        // 文件的文件名
        mv.addObject(NormalExcelConstants.FILE_NAME, "车辆参数设置");
        // 数据的类型
        mv.addObject(NormalExcelConstants.CLASS, VeOaCarSetVo.class);
        // 获取redis存的用户值

        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）
        ExportParams exportParams = new ExportParams("车辆参数设置", "导出人:" + user.getRealname(), "导出车辆参数设置");
        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
        mv.addObject(NormalExcelConstants.DATA_LIST, list);
        return mv;
    }

    //导入
    @AutoLog(value = "车辆参数设置-导入excel表格")
    @ApiOperation(value = "导入excel表格", notes = "车辆参数设置—导入excel表格")
    @PostMapping(value = "excelImport")
    public Result<?> excelImport(HttpServletRequest req, HttpServletResponse resp) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            MultipartFile file = entity.getValue();// 获取上传文件对象
            ImportParams params = new ImportParams();
            params.setTitleRows(2);
            params.setHeadRows(1);
            params.setNeedSave(true);
            try {
                List<VeOaCarSetVo> list = ExcelImportUtil.importExcel(file.getInputStream(), VeOaCarSetVo.class, params);
                System.out.println(list);

                // 获取redis存的用户值
                LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
                // 插入数据的集合
                List<VeOaCarSetEntity> entityList =new ArrayList<>();
                int count =list.size();
                for (VeOaCarSetVo vo:list){
                    if(vo.getValue()==null||vo.getValue().equals("")){
                        count--;
                        continue ;
                    }
                    // 重复校验
                    VeOaCarSetEntity entitya =iVeOaCarSetService.repetition(vo);


                    if(entitya!=null){

                        return  Result.error(500,"参数设定值不能重复！");

                    }
                    VeOaCarSetEntity veOaCarSetEntity =new VeOaCarSetEntity();

                    // 查类型ID
                    SysDictItemEntity veOaSysDictEntity=    iVeSysDictService.queryDictName(vo.getTypeName());


                    veOaCarSetEntity.setTypeId(veOaSysDictEntity.getId());
                    veOaCarSetEntity.setValue(vo.getValue());
                    veOaCarSetEntity.setSort(vo.getSort());
                    veOaCarSetEntity.setCreateBy(user.getId());

                    veOaCarSetEntity.setUpdateBy(user.getId());
                    veOaCarSetEntity.setTerminalId(1);
                    veOaCarSetEntity.setCreateByName(user.getRealname());
                    veOaCarSetEntity.setUpdateByName(user.getRealname());

                    entityList.add(veOaCarSetEntity);
                }
                //update-begin-author:taoyan date:20190528 for:批量插入数据
                long start = System.currentTimeMillis();
                iVeOaCarSetService.saveBatch(entityList);
                //400条 saveBatch消耗时间1592毫秒  循环插入消耗时间1947毫秒
                //1200条  saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒
//                log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
                //update-end-author:taoyan date:20190528 for:批量插入数据
                return Result.ok("文件导入成功！数据行数：" + count);
            } catch (Exception e) {
//                log.error(e.getMessage(), e);
                return Result.error("文件导入失败:" + e.getMessage());
            } finally {
                try {
                    file.getInputStream().close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return Result.error("文件导入失败！");
//        return super.importExcel(req, resp, VeOaCarJiayouEntity.class);
    }

    //导出excel模板
    @AutoLog(value = "车辆参数设置-导出excel模板")
    @ApiOperation(value = "导出excel模板", notes = "车辆参数设置—导出excel模板")
    @GetMapping(value = "exportModel")
    public ModelAndView exportModel() {
        // 创建导出流

        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        // 文件的文件名

        mv.addObject(NormalExcelConstants.FILE_NAME, "车辆参数设置");
        mv.addObject(NormalExcelConstants.CLASS, VeOaCarSetVo.class);
        // 获取redis存的用户值

        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        // ExportParams  Export工具类   （参数1--》title:表格标题  参数2--》secomdTitle:第二行的标题，  参数3--》secomdTitle:最下面尾部的信息）

        ExportParams exportParams = new ExportParams("车辆参数设置", "导出人:" + user.getRealname(), "导出车辆参数设置");

        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
        mv.addObject(NormalExcelConstants.DATA_LIST, new ArrayList<VeOaCarSetVo>());
        return mv;
    }



    // 获取车辆姓名下拉框
    @AutoLog(value = "车辆参数设置-获取分类名下拉框")
    @ApiOperation(value="获取分类名下拉框", notes="车辆加油记录-获取分类名下拉框")
    @PostMapping(value = "/getCategoryname")
    public Result getCategoryname() {
        return Result.OK(iVeSysDictService.categorynameBox());
    }



    // 修改参数
    @AutoLog(value = "车辆参数设置-修改参数")
    @ApiOperation(value="修改参数", notes="车辆加油记录-修改参数")
    @PostMapping(value = "/amendSet")
    public Result amendSet(VeOaCarSetEntity veOaCarSetEntity,Integer state)  {
    if(state==1){

    }else {
        VeOaCarSetVo veOaCarSetVo =new VeOaCarSetVo();
        veOaCarSetVo.setValue(veOaCarSetEntity.getValue());
        // 重复校验
        VeOaCarSetEntity entitya =iVeOaCarSetService.repetition(veOaCarSetVo);


        if(entitya!=null){

            return  Result.error(500,"参数设定值不能重复！");

        }
    }

        // 获取redis存的用户值
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        VeOaCarSetEntity V =new VeOaCarSetEntity();

        V.setCreateBy(user.getId());
        V.setUpdateBy(user.getId());
        V.setTerminalId(1);
        V.setCreateByName(user.getRealname());
        V.setUpdateByName(user.getRealname());

        Integer result= iVeOaCarSetService.amendSet(veOaCarSetEntity);
        return Result.OK(result);
    }
    // 增加参数
    @AutoLog(value = "车辆参数设置-增加参数")
    @ApiOperation(value="增加参数", notes="车辆参数设置-增加参数")
    @PostMapping(value = "/addSet")
    public Result addSet(VeOaCarSetEntity veOaCarSetEntity ) {
        // 获取redis存的用户值
        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        VeOaCarSetVo veOaCarSetVo =new VeOaCarSetVo();
        veOaCarSetVo.setValue(veOaCarSetEntity.getValue());
        // 重复校验
        VeOaCarSetEntity entitya =iVeOaCarSetService.repetition(veOaCarSetVo);


        if(entitya!=null){

            return  Result.error(500,"参数设定值不能重复！");

        }
        VeOaCarSetEntity V =new VeOaCarSetEntity();

        V.setCreateBy(user.getId());
        V.setUpdateBy(user.getId());
        V.setTerminalId(1);
        V.setCreateByName(user.getRealname());
        V.setUpdateByName(user.getRealname());
        Integer result= iVeOaCarSetService.addSet(veOaCarSetEntity);
        return Result.OK(result);
    }
    // 高级搜索
    @AutoLog(value = "车辆参数设置-高级搜索")
    @ApiOperation(value="高级搜索", notes="车辆参数设置-高级搜索")
    @PostMapping(value = "/advancedQuery")

    public Result advancedQuery(@RequestBody String queryArray) {
        Map<String, List<QueryCondition>> maps = (Map<String, List<QueryCondition>>) JSON.parse(queryArray);
        List<QueryCondition> list=new ArrayList<QueryCondition>(JSONArray.parseArray(maps.get("queryArray").toString(),QueryCondition.class));
        String  conditionStr =  QueryConditionTool.getQueryConditionTool().advancedQuery(list);

        HashMap<String , Object>  map=null;
        System.out.println("conditionStr"+conditionStr);
        try {
            map= iVeOaCarSetService.advancedQuery(conditionStr);
        } catch (Exception e) {

            // 查询表格总行数
            return Result.error("s");
        }
        return  Result.OK(map);
    }

    @AutoLog(value = "车辆参数设置-模板地址获取")
    @ApiOperation(value = "模板地址", notes = "车辆参数设置-模板地址获取")
    @PostMapping(value = "/getUrl")
    public Result<T> getUrl() throws Exception {
        Result result = new Result();
        String url= OssDownloadUtil.getOssDownloadUtil().downFileFromOSS("车辆参数设置模板.xls");
        result.success(url);
        return result;
    }

}
